package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RequestMapping("/user")
@RestController
@SuppressWarnings("all")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 前端退出登录
     *
     * @return
     */
    @PostMapping("/loginout")
    public R logout(HttpSession session) {
        try {

            System.out.println("user：" + session.getAttribute("user"));

//            session.removeAttribute("user");
            session.invalidate();
            return R.success("退出登录成功！");
        } catch (Exception e) {
            e.printStackTrace();
            return R.success("退出登录失败！");
        }

    }


    /**
     * 登录
     *
     * @param map
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody Map<String, String> map, HttpSession session) {
        System.out.println("map = " + map);

        //1. 取出手机号和验证码
        String phone = map.get("phone");
        String code = map.get("code");

        //2. 校验验证码是否正确！
        //String valCode = (String) session.getAttribute(phone);
        String valCode = (String) redisTemplate.opsForValue().get(phone);

        // 判断验证码是否超时
        if (null == valCode) {
            return R.error("验证码过期了！");
        }

        //2.1 如果验证码一样，就认为登录成功了！
        if (valCode.equalsIgnoreCase(code)) {

            //2.2. 拿着手机号码去查询数据库，看看有没有这个用户存在
            User user = userService.findUser(phone);


            //2.2.1 判断有没有用户
            if (user == null) {

                //2.2.2 表示这个用户是第一次来，要保存到数据库里面。
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);

                userService.add(user);
            }

            //2.3 把用户对象保存到session作用域
            session.setAttribute("user", user);

            // 这里登录成功需要清除redis中存的值
            redisTemplate.delete(phone);

            return R.success("登录成功！");
        }

        return R.error("登录失败！");
    }

    /**
     * 获取验证
     *
     * @param phone
     * @param session
     * @return
     */
    @GetMapping("/smscode")
    public R sendSmsCode(String phone, HttpSession session) {

        //1. 生成验证码
        String code = ValidateCodeUtils.generateValidateCode4String(6);
        System.out.println("code=" + code); //1234

        //2. 真实的场景： 给手机号发短信
        //SMSUtils.sendMessage("签名", "模板" , phone  , code );

        //3. 为了能够去校验一会登录传递上来的验证码是否正确，需要把这个验证码保存到session作用域
        //session.setAttribute(phone, code);

        // 这里用redis进行改造一下
        redisTemplate.opsForValue().set(phone, code, 1, TimeUnit.MINUTES);

        //4. 返回
        return R.success(code);

    }
}
